﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;

namespace RiskMan.DataClass.Models.Plaza_II.FortsOrdlogRepl
{
    /// <summary>
    /// Таблица событий
    /// </summary>
    public class SysEvents: INotifyPropertyChanged
    {
        #region private

        private long _replId;
        private long _replRev;
        private long _replAct;
        private long _eventId;
        private int _sessId;
        private int _eventType;
        private string _message;

        #endregion

        #region public

        /// <summary>
        /// Служебное поле подсистемы репликации
        /// </summary>
        public long ReplId
        {
            get { return _replId; }
            set
            {
                if (_replId != value)
                {
                    _replId = value;
                    RaisePropertyChanged("ReplId");
                }
            }
        }

        /// <summary>
        /// Служебное поле подсистемы репликации
        /// </summary>
        public long ReplRev
        {
            get { return _replRev; }
            set
            {
                if (_replRev != value)
                {
                    _replRev = value;
                    RaisePropertyChanged("ReplRev");
                }
            }
        }

        /// <summary>
        /// Служебное поле подсистемы репликации
        /// </summary>
        public long ReplAct
        {
            get { return _replAct; }
            set
            {
                if (_replAct != value)
                {
                    _replAct = value;
                    RaisePropertyChanged("ReplAct");
                }
            }
        }

        /// <summary>
        /// Уникальный идентификатор события
        /// </summary>
        public long EventId
        {
            get { return _eventId; }
            set
            {
                if (_eventId != value)
                {
                    _eventId = value;
                    RaisePropertyChanged("EventId");
                }
            }
        }

        /// <summary>
        /// Номер сессии
        /// </summary>
        public int SessId
        {
            get { return _sessId; }
            set
            {
                if (_sessId != value)
                {
                    _sessId = value;
                    RaisePropertyChanged("SessId");
                }
            }
        }

        /// <summary>
        /// Тип события
        ///event_type = 1
        ///message = "session_data_ready"
        ///Закончена загрузка данных из клиринговой системы в торговую перед началом новой торговой сессии
        ///event_type = 2
        ///message = "intraday_clearing_finished"
        ///Все расчетные процедуры в промклиринге закончены
        ///event_type = 4
        ///message = "intraday_clearing_started"
        ///Начало промклиринга
        ///event_type = 5
        ///message = "clearing_started"
        ///Начало основного клиринга
        ///event_type = 6
        ///message = "extension_of_limits_finished"
        ///Раздвижка лимитов закончена
        ///event_type = 8
        ///message = "broker_recalc_finished"
        ///Денежные средства после промклиринга пересчитаны
        /// </summary>
        public int EventType
        {
            get { return _eventType; }
            set
            {
                if (_eventType != value)
                {
                    _eventType = value;
                    RaisePropertyChanged("EventType");
                }
            }
        }

        /// <summary>
        /// Описание события
        /// </summary>
        public string Message
        {
            get { return _message; }
            set
            {
                if (_message != value)
                {
                    _message = value;
                    RaisePropertyChanged("Message");
                }
            }
        }

        #endregion

        #region event PropertyChangedEventHandler

        public event PropertyChangedEventHandler PropertyChanged;

        protected void RaisePropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        #endregion

        #region Processing
        public static SysEvents ParseSysEvents(Dictionary<String, String> relation)
        {
            SysEvents tmp = new SysEvents();
            tmp.Parse(relation);
            return tmp;
        }

        public void Parse(Dictionary<String, String> relation)
        {
            foreach (String field in relation.Keys)
            {
                String value = relation[field];

                switch (field)
                {
                    case "replID": long.TryParse(value, out _replId); break;
                    case "replRev": long.TryParse(value, out _replRev); break;
                    case "replAct": long.TryParse(value, out _replAct); break;
                    case "event_id": long.TryParse(value, out _eventId); break;
                    case "sess_id": int.TryParse(value, out _sessId); break;
                    case "event_type": int.TryParse(value, out _eventType); break;
                    case "message": _message = value; break; 

                };
            }
        }

        public static void AddValueToObsColSysEvents(SysEvents inst)
        {
            MainWindow.StaticLevel._dataProvider.FortsOrdlogReplSysEventsList.Add(inst);
        }
        #endregion
    }
}
